package com.xbongbong.pro.statistic.result.pojo.dto;

import com.xbongbong.paas.toolbox.wrap.BaseDTO;
import com.xbongbong.paas.toolbox.wrap.QueryIgnore;
import com.xbongbong.pro.statistic.pojo.FiscalYearTimePojo;
import com.xbongbong.pro.statistic.result.pojo.ChartDrillInfoPojo;
import com.xbongbong.pro.statistic.result.pojo.ChartIdPojo;
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import org.hibernate.validator.constraints.Range;

import java.util.List;
import java.util.Map;

/**
 * 获取图表结果请求基础参数
 * @author zcp
 * @version v1.0
 * @date 2019/4/1 11:15
 * @since v1.0
 */
@Getter
@Setter
@ToString
public class ChartResultBaseDTO extends BaseDTO {
    private static final long serialVersionUID = -8727843766772266684L;

    /**
     * 标记千人千面请求：千人千面的需要对返回数据按照idIn的顺序封装图表
     * 对应ResultFromEnum枚举
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private String from;
    /**
     * 组织架构类型：1员工，2部门
     */
    @Range(min = 1, max = 2, message="组织架构类型选择不正确")
    @Getter(onMethod_ = {@QueryIgnore})
    private Integer companyStructType;
    /**
     * 筛选的部门id
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Long checkedDepId;
    /**
     * 筛选的员工id
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private String checkedUserId;
    /**
     * 筛选的部门和员工id
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<DepAndUserDTO> checkedId;
    /**
     * 筛选的员工数组
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<String> checkedUserIdIn;
    /**
     * 筛选的部门数组
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<Long> checkedDepIdIn;
    /**
     * 时间筛选参数
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private FiscalYearTimePojo timeFilter;

    /**
     * 一层筛选id，可以作为图表id、销售阶段id、工单模版id、产品id、合同模版id、客户模版id、产品分类id等
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Long refId;
    /**
     * 可以作为第二个refId(下面这个 argTwoId使用在阶段那，前端不好改)
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Long refTwoId;
    /**
     * 二层筛选id，可以配合refId。比如阶段筛选formId + stageProcessId
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Long argTwoId;
    /**
     * 字符串数组筛选，可以配合refId。比如阶段筛选formId + 多个code（阶段code集合）
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<String> argStrIn;

    /**
     * 产品名称或编号查询条件
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private String nameLike;

    /**
     * 省份筛选，当全国筛选时，值为@see MapConstant内存放
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private String province;

    /**
     * 分页的页数
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Integer page;
    /**
     * 分页的每页记录数量
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Integer pageSize;

    /**
     * 删除标记
     * 该字段不要暴露给前端
     */
    private Integer del;

    /**
     * 是否全局筛选
     */
    private Integer global;
    /**
     * 1开启，0未开启；默认1，如果关闭分组则关闭下面所有图表--需提示用户
     * 该字段不要暴露给前端
     */
    private Integer enable;


    /**
     * 导出标记(导出时需以scroll进行分页),true为导出
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Boolean exportFlag;

    /**
     * 是否从缓存读取，默认过缓存，这个改造现在只有工作台用到的几处
     */
    private boolean readCache = true;

    /**
     * 图表id数组
     * 格式更改，不能直接用来作为查库条件
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<ChartIdPojo> chartIdIn;

    /**
     * 系统图表id数组
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<Long> sysIdIn;

    /**
     * 自定义图表id数组
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private List<Long> customIdIn;

    /**
     * 系统、自定义区分标志 1为系统 2为自定义
     */
    private Integer statisticsType;

    /**
     * 自定义业绩目标请求标记
     */
    private Boolean performanceFlag = false;

    /**
     * 钻取操作，如果为空则未钻取，否则代表进行钻取，需处理聚合字段及筛选条件
     * key：@link DrillFieldEnum
     * value：ChartDrillInfoPojo
     */
    @Getter(onMethod_ = {@QueryIgnore})
    private Map<String, ChartDrillInfoPojo> drill;
    /**
     * 参数接收完后的加工处理，
     * 比如nameLike的去除前后空格
     * @author zcp
     * @date 2019/3/18 16:56
     * @since v1.0
     * @version v1.0
     */
    public void postProcess() {
        //防止前端随意传值，在此重新置入默认值
        this.del = 0;
        this.enable = 1;
    }
}
